package com.tsj.spzx.service.Impl;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.CircleCaptcha;
import com.tsj.spzx.common.RedisStoredKey;
import com.tsj.spzx.model.vo.system.ValidateCodeVo;
import com.tsj.spzx.service.ValidateCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
public class ValidateCodeServiceImpl implements ValidateCodeService {

    // 生成的验证码要存入redis
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Override
    public ValidateCodeVo getValidateCode() {
        // 使用 cn.hutool 依赖
        // 生成验证码图片 宽 150 高 48 验证码位数 4 干扰元素 3
        CircleCaptcha circleCaptcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 3);
        // 验证码的 四位数字
        String codeValue = circleCaptcha.getCode();
        // 获取图片 以byte的方式存储成了字符串
        String imageBase64Data = circleCaptcha.getImageBase64Data();

        // 存储到redis  key就生成个UUID
        String codeKey = UUID.randomUUID().toString().replaceAll("-", "");
        redisTemplate.opsForValue().set(
                RedisStoredKey.VALIDATE_CODE_PREFIX + codeKey,
                codeValue,
                5,          // 有效时间 5分钟
                TimeUnit.MINUTES);

        ValidateCodeVo validateCodeVo = new ValidateCodeVo();
        // 把key和验证码图片返回给前端
        validateCodeVo.setCodeKey(codeKey);
        // 我们返回的value，不是验证码的数字，而是验证码的图片，加上前缀就直接可以显示在页面上
        validateCodeVo.setCodeValue("data:image/png;base64"+imageBase64Data);
        return validateCodeVo;
    }
}
